package com.gyms.manager;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.classic.okhttp.beans.HVProductInfoBean;
import com.classic.okhttp.beans.HVShareActivityBean;
import com.classic.okhttp.beans.HVVenueBean;
import com.classic.okhttp.enums.Enum;
import com.gyms.R;
import com.gyms.activity.WebViewActivity;
import com.gyms.adapter.MyCouponAdapterNew;
import com.gyms.base.BaseActivity;
import com.gyms.constant.Constants;
import com.umeng.socialize.bean.SHARE_MEDIA;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import utils.DateUtil;
import utils.DecimalUtils;
import utils.ScreenUtils;
import utils.StringUtils;

/**
 * Created by ltx on 17/5/25
 * 状态逻辑的相关计算
 */

public class StateUtils {
    private static final int[] COUPON_TEXT_COLORS=new int[]{R.color.c_333333,R.color.c_999999,R.color.white};

    private final static String S_CODE="code=";
    private final static String S_USER_ID_FLAG="source=";

    private final static int S_WX=1;//微信
    private final static int S_WX_CIRCLE=2;//朋友圈
    private final static int S_QQ=3;//qq

    /**
     * 卡卷选择的处理
     * @param mIvCouponChose  iv
     * @param isSelected 卡卷是否选择
     * @param isExclusive 是否是专属
     */

    public static void setCardIsSelect(ImageView mIvCouponChose, boolean isSelected, boolean isExclusive){
        if(isSelected){
            mIvCouponChose.setVisibility(View.VISIBLE);
            mIvCouponChose.setImageResource(isExclusive?R.mipmap.icon_xuanze2:R.mipmap.icon_xuanze1);
        }else {
            mIvCouponChose.setVisibility(View.INVISIBLE);
        }
    }

    /**
     * 处理优惠券使用的条件  当满多少的钱为0。01 文案为： 任意金额可直接抵扣
     * @param mContext 上下文
     * @param mTv tv
     * @param condition 满多少的金额
     */
    public static void setCouponUseMoneyStr(Context mContext, TextView mTv, double condition){
        String mStrCondition;
        if(condition==0.01){
            mStrCondition=mContext.getString(R.string.str_coupon_use_money);
        }else {
             mStrCondition=String.format(mContext.getString(R.string.str_coupon_condition), DecimalUtils.doubleToIntOrD(condition));
        }
        mTv.setText(mStrCondition);
    }

    /**
     * 处理卡卷的状态
     * @param mCouponViewHolder 卡卷的ViewHolder
     * @param isWork Available(0) Used(1)  Expired(2)
     */

    public static void showCouponState(Context mContext, MyCouponAdapterNew.CouponViewHolder mCouponViewHolder, Enum.EnumCounponStatusEnum isWork,boolean isExclusive) {
        if(isWork==Enum.EnumCounponStatusEnum.Available){//可用
            doCardState(mContext, mCouponViewHolder, true,isExclusive);
        }else if(isWork==Enum.EnumCounponStatusEnum.Used){//已使用
            mCouponViewHolder.mIvCanUse.setImageResource(R.mipmap.icon_yishiyong);
            doCardState(mContext, mCouponViewHolder, false,isExclusive);
        }else if(isWork==Enum.EnumCounponStatusEnum.Expired){//过期
            mCouponViewHolder.mIvCanUse.setImageResource(R.mipmap.icon_yiguoqi);
            doCardState(mContext, mCouponViewHolder, false,isExclusive);
        }
    }

    /**
     *优惠券 是否可用
     * @param isCanUse true 333333 可用  false  999999不可用
     */

    private static void changeCouponTextColor(Context mContext,TextView mTvView,boolean isCanUse) {
        mTvView.setTextColor(ContextCompat.getColor(mContext,isCanUse?COUPON_TEXT_COLORS[0]:COUPON_TEXT_COLORS[1]));
    }

    /**
     * 优惠券是否可用的状态
     * @param mContext 上下文
     * @param mCouponViewHolder viewholer
     * @param isCanUse 该优惠券是否可用
     */

    public static void doShowIsCanUseState(Context mContext,MyCouponAdapterNew.CouponViewHolder mCouponViewHolder,boolean isCanUse,boolean isExclusive){
        if(isCanUse){//可用
            doCardState(mContext, mCouponViewHolder, true,isExclusive);
        }else{//不可用
            mCouponViewHolder.mIvCanUse.setImageResource(R.mipmap.icon_bukeyong);//可用不可用的图标
            doCardState(mContext,mCouponViewHolder,false,isExclusive);
        }
    }

    /**
     * 卡卷可用和不可用的状态
     * @param mContext mContext
     * @param mCouponViewHolder mCouponViewHolder
     * @param isAvailable 是否是可使用的状态
     * @param isExclusive 是否是专属 专属绿色图标  通用黄色图标
     */

    private static void doCardState(Context mContext, MyCouponAdapterNew.CouponViewHolder mCouponViewHolder, boolean isAvailable,boolean isExclusive) {
        changeCouponTextColor(mContext,mCouponViewHolder.mTvCouponName,isAvailable);//卡卷名颜色
        changeCouponTextColor(mContext,mCouponViewHolder.mTvCouponMoneyUse,isAvailable);//抵用的金额的颜色
        changeCouponTextColor(mContext,mCouponViewHolder.mTvCouponUseRule,isAvailable);//使用规则
        mCouponViewHolder.mIvMoneyIcon.setBackgroundResource(isAvailable?R.mipmap.icon_rmb:R.mipmap.icon_rmb2);//人民币符号
        mCouponViewHolder.mTvCouponMoney.setTextColor(ContextCompat.getColor(mContext,isAvailable?COUPON_TEXT_COLORS[2]:COUPON_TEXT_COLORS[1]));
        mCouponViewHolder.mIvIsCanDetail.setVisibility(isAvailable?View.VISIBLE:View.GONE);//问号
        mCouponViewHolder.mIvCanUse.setVisibility(isAvailable?View.GONE:View.VISIBLE);//不可用图标
        mCouponViewHolder.mIvCouponUseRulePoint.setImageResource(isAvailable?R.drawable.sp_black_circle:R.drawable.sp_gray_circle);//使用规则小点
        mCouponViewHolder.mIvCouponMoneyUsePoint.setImageResource(isAvailable?R.drawable.sp_black_circle:R.drawable.sp_gray_circle);//使用条件小点
        if(!isAvailable){//不可用的
            mCouponViewHolder.mFlCouponMoney.setBackgroundResource(R.drawable.yiyong);
            mCouponViewHolder.mRlCouponContent.setBackgroundResource(R.drawable.yiyong2);
            mCouponViewHolder.mTvShareOrder.setVisibility(View.GONE);
        }else if(isExclusive){//专属
            mCouponViewHolder.mFlCouponMoney.setBackgroundResource(R.drawable.zhuanshu);
            mCouponViewHolder.mRlCouponContent.setBackgroundResource(R.drawable.tongyong2);
            mCouponViewHolder.mTvShareOrder.setVisibility(View.GONE);
        }else{//通用
            mCouponViewHolder.mFlCouponMoney.setBackgroundResource(R.drawable.tongyong);
            mCouponViewHolder.mRlCouponContent.setBackgroundResource(R.drawable.tongyong2);
            mCouponViewHolder.mTvShareOrder.setVisibility(View.VISIBLE);
        }
        //解决不可能标签标题过长
        RelativeLayout.LayoutParams layoutParams= (RelativeLayout.LayoutParams) mCouponViewHolder.mLlCouponName.getLayoutParams();
        if(mCouponViewHolder.mIvCanUse.getVisibility()==View.VISIBLE){
            layoutParams.addRule(RelativeLayout.LEFT_OF,R.id.iv_can_use);
        }else {
            if(android.os.Build.VERSION.SDK_INT>=17)
            layoutParams.removeRule(RelativeLayout.LEFT_OF);
        }
    }

    /**
     * 动态改变减额的高宽 按比例 208/750
     * @param flCouponMoney 减额的布局
     */

    public static void doSetWidth(Context mContext,FrameLayout flCouponMoney) {
        LinearLayout.LayoutParams mFlpCouponMoney = (LinearLayout.LayoutParams) flCouponMoney.getLayoutParams();
        mFlpCouponMoney.width = ScreenUtils.getScreenWidth(mContext)*208/750;
        flCouponMoney.setLayoutParams(mFlpCouponMoney);
    }

    /**
     * 获取即时搜索的场馆名称
     * @param mDatas list
     * @param isGymSearch 是否是场馆搜索
     */

    public static ArrayList<String> doGetSearchGymName(List<?> mDatas,boolean isGymSearch){
        ArrayList<String> mGymNames=new ArrayList<>();
       if(isGymSearch){//场馆
           ArrayList<HVVenueBean> mGymBeans= (ArrayList<HVVenueBean>) mDatas;
           for(HVVenueBean mGymBean: mGymBeans){
               if(mGymBean.matchCondition){
                   mGymNames.add(mGymBean.getVenueName());
               }
           }
       }else {//课程
           ArrayList<HVProductInfoBean> mProductBeans= (ArrayList<HVProductInfoBean>) mDatas;
           for(HVProductInfoBean mProductBean: mProductBeans){
                   mGymNames.add(mProductBean.getProductName());
           }
       }
       return mGymNames;
    }

    /**
     * 获取订单状态
     * @param mOrderType 订单当前状态类型
     * @return 订单状态
     */
    public static Enum.EnumOrderState getOrderState(int mOrderType) {
        Enum.EnumOrderState mOrderState =null;
        switch (mOrderType){
            case Constants.MY_ORDER_ALL://全部
                mOrderState=Enum.EnumOrderState.None;
                break;
            case Constants.MY_ORDER_UN_COMPLETE://未完成
                mOrderState=Enum.EnumOrderState.Paid;
                break;
            case Constants.MY_ORDER_COMPLETE://已完成
                mOrderState=Enum.EnumOrderState.Used;
                break;
            case Constants.MY_ORDER_REFUND://已退款
                mOrderState=Enum.EnumOrderState.Refund;
                break;
        }
        return mOrderState;
    }

    /**
     * 拨打电话
     * @param mContext context
     * @param mPhoneNum 电话号码
     */

    public static void callMobilePhone(Context mContext,String mPhoneNum){
        Uri data = Uri.parse("tel:" + mPhoneNum);
        Intent  mPhoneIntent = new Intent(Intent.ACTION_DIAL);
        mPhoneIntent.setData(data);
        mContext.startActivity(mPhoneIntent);
    }

    /**
     * 获取分享的平台
     * @param platform 平台
     * @return String
     */

    public static String getSharePlatform(SHARE_MEDIA platform){
        String mSharePlatformStr="";
        if(platform.equals(SHARE_MEDIA.WEIXIN_CIRCLE)){
            mSharePlatformStr="微信";
        }else if(platform.equals(SHARE_MEDIA.WEIXIN)){
            mSharePlatformStr="微信";
        }else if(platform.equals(SHARE_MEDIA.QQ)){
            mSharePlatformStr="QQ";
        }
        return mSharePlatformStr;
    }


    public static String doSpliteCode(String mResult){
        String mCouponCode="";
        if(StringUtils.isNull(mResult)||!mResult.contains(S_CODE)){
            return mCouponCode;
        }
        String[] mResults=mResult.split(S_CODE);
        mCouponCode=mResults[1];
        return mCouponCode;
    }

    /**
     * 判断是否是未付款
     * @param state 状态
     * @return 是否未付款
     */

    public static boolean isNotPay(int state) {
        return state== Enum.EnumOrderState.Nopay.value;
    }

    /**
     * 分享url 拼接userId
     * @param mTempUrl 目标url
     * @return 组合后的url
     */
    public static String shareUrlAppendUserId(String mTempUrl){
        String mUserId=DataCenter.getInstance().getUserId();
        if(mTempUrl.contains(S_USER_ID_FLAG)||StringUtils.isNull(mUserId)){
            return mTempUrl;
        }
         StringBuilder mSB=new StringBuilder(mTempUrl);
        if(mTempUrl.contains("?")){
            mSB.append("&").append(S_USER_ID_FLAG).append(mUserId);
        }else {
            mSB.append("?").append(S_USER_ID_FLAG).append(mUserId);
        }
        return mSB.toString();
    }

    /**
     * 获取分享渠道的类型
     * @param platform 渠道类型
     * @return 类型
     */

    public static Enum.EnumShareTypeEnum getSharePlatformType(SHARE_MEDIA platform){
        Enum.EnumShareTypeEnum mSharePlatform=null;
        if(platform.equals(SHARE_MEDIA.WEIXIN_CIRCLE)){
            mSharePlatform= Enum.EnumShareTypeEnum.Wechattimeline;
        }else if(platform.equals(SHARE_MEDIA.WEIXIN)){
            mSharePlatform=Enum.EnumShareTypeEnum.Wechatsession;
        }else if(platform.equals(SHARE_MEDIA.QQ)){
            mSharePlatform=Enum.EnumShareTypeEnum.Qqsession;
        }
        return mSharePlatform;
    }

    /**
     * 根据int 分享渠道转化为SHARE_MEDIA
     * @param mPlatform  EnumShareType.WechatSession   = 1;
    EnumShareType.WechatTimeline  = 2;
    EnumShareType.QqSession       = 3;
     * @return SHARE_MEDIA
     */

    public static SHARE_MEDIA getShareMedia(int mPlatform){
        SHARE_MEDIA mPlatformMedia=null;
        switch (mPlatform){
            case S_WX:
                mPlatformMedia=SHARE_MEDIA.WEIXIN;
                break;

                case S_WX_CIRCLE:
                    mPlatformMedia=SHARE_MEDIA.WEIXIN_CIRCLE;
                    break;

                    case S_QQ:
                        mPlatformMedia=SHARE_MEDIA.QQ;
                        break;
        }
        return mPlatformMedia;
    }

    /**
     * 获取类自身所有方法(不会获取父类方法)
     * @return  Method[]
     */

    private static Method[] getDeclaredMethods(String mClassName){
        Class clazz;
        Method[] methods=null;
        try {
            clazz = Class.forName(mClassName);
            if(null!=clazz){
                methods=clazz.getDeclaredMethods();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //获取类自身所有方法(不会获取父类方法)
        return methods;
    }

    /**
     * 判断该类自身的方法 是否包含某方法
     * @param mClassName 类名
     * @param mMethod 方法名
     * @return 是否包含
     */

    public static boolean isHaveThisMethod(String mClassName,String mMethod){
        boolean isHaveThisMethod=false;
        Method[] methods= getDeclaredMethods(mClassName);
        for (Method method:methods){
            if(mMethod.equals(method.getName())){//包含该方法
                isHaveThisMethod=true;
               break;
            }
        }
        return isHaveThisMethod;
    }

    /**
     * 分享活动是否正在进行
     * @param mHVShareActivityBean mHVShareActivityBean
     * @return 是否是分享活动
     */

    public static boolean isShareActivity(HVShareActivityBean mHVShareActivityBean){
        if(null==mHVShareActivityBean){
            return false;
        }

        return isShareActivitying(mHVShareActivityBean);
    }

    /**
     *
     * @param mHVShareActivityBean mHVShareActivityBean
     * @return 活动是否还在进行 true 还在进行 false 已结束
     */
    private static boolean isShareActivitying(HVShareActivityBean mHVShareActivityBean){
        int mNowTime= DateUtil.getCurTimeS();//当前时间
        return mNowTime<=mHVShareActivityBean.getEndTime();
    }

    /**
     * 前往webView
     * @param mActivity BaseActivity
     * @param mTitle  mTitle
     * @param mUrl mUrl
     */

    public static void goWebView(BaseActivity mActivity,String mTitle,String mUrl){
        Intent intent = new Intent(mActivity, WebViewActivity.class);
        intent.putExtra("title", mTitle);
        intent.putExtra("url", mUrl);
        mActivity.startActivity(intent, false);
    }

    /**
     * 订单是否显示分享有礼活动
     * @return true 显示 false 隐藏
     */

    public static boolean isShowOrderShare(boolean isShareActivitying,int mOrderType){
        boolean isNopay=mOrderType!=Enum.EnumOrderState.Nopay.value;
        return isNopay&&isShareActivitying;
    }


}
